#!/bin/bash

# 东宁百事通后台部署脚本
# 使用方法: ./scripts/deploy.sh [环境] [部署方式]
# 环境: development | production
# 部署方式: docker | pm2

set -e  # 遇到错误立即退出

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查参数
ENVIRONMENT=${1:-production}
DEPLOY_METHOD=${2:-docker}

log_info "开始部署 东宁百事通后台..."
log_info "环境: $ENVIRONMENT"
log_info "部署方式: $DEPLOY_METHOD"

# 检查必要工具
check_requirements() {
    log_info "检查部署环境..."
    
    if [[ "$DEPLOY_METHOD" == "docker" ]]; then
        if ! command -v docker &> /dev/null; then
            log_error "Docker 未安装"
            exit 1
        fi
        
        if ! command -v docker-compose &> /dev/null; then
            log_error "Docker Compose 未安装"
            exit 1
        fi
    elif [[ "$DEPLOY_METHOD" == "pm2" ]]; then
        if ! command -v node &> /dev/null; then
            log_error "Node.js 未安装"
            exit 1
        fi
        
        if ! command -v npm &> /dev/null; then
            log_error "npm 未安装"
            exit 1
        fi
        
        if ! command -v pm2 &> /dev/null; then
            log_error "PM2 未安装，正在安装..."
            npm install -g pm2
        fi
    fi
    
    log_success "环境检查完成"
}

# 创建必要目录
create_directories() {
    log_info "创建必要目录..."
    
    mkdir -p /var/log/dongning
    mkdir -p /var/www/dongning
    mkdir -p ./File/Images/Avatar
    mkdir -p ./File/Images/PostImage
    mkdir -p ./ssl
    
    log_success "目录创建完成"
}

# 设置环境变量
setup_environment() {
    log_info "设置环境变量..."
    
    if [[ ! -f ".env" ]]; then
        if [[ -f ".env.example" ]]; then
            cp .env.example .env
            log_warning "已复制 .env.example 到 .env，请根据实际情况修改配置"
        else
            log_error ".env 文件不存在，请创建环境配置文件"
            exit 1
        fi
    fi
    
    # 设置环境变量
    export NODE_ENV=$ENVIRONMENT
    
    log_success "环境变量设置完成"
}

# Docker部署
deploy_with_docker() {
    log_info "使用 Docker 进行部署..."
    
    # 停止现有容器
    docker-compose down || true
    
    # 构建并启动服务
    docker-compose up -d --build
    
    # 等待服务启动
    log_info "等待服务启动..."
    sleep 30
    
    # 检查服务状态
    if docker-compose ps | grep -q "Up"; then
        log_success "Docker 部署完成"
        docker-compose ps
    else
        log_error "Docker 部署失败"
        docker-compose logs
        exit 1
    fi
}

# PM2部署
deploy_with_pm2() {
    log_info "使用 PM2 进行部署..."
    
    # 安装依赖
    npm install --production
    
    # 停止现有进程
    pm2 stop dongning-backend || true
    pm2 delete dongning-backend || true
    
    # 启动应用
    pm2 start ecosystem.config.js --env $ENVIRONMENT
    
    # 保存PM2配置
    pm2 save
    pm2 startup
    
    log_success "PM2 部署完成"
    pm2 status
}

# 健康检查
health_check() {
    log_info "进行健康检查..."
    
    local max_attempts=10
    local attempt=1
    
    while [[ $attempt -le $max_attempts ]]; do
        if curl -f http://localhost:3000/health &> /dev/null; then
            log_success "健康检查通过"
            return 0
        fi
        
        log_warning "健康检查失败，重试中... ($attempt/$max_attempts)"
        sleep 10
        ((attempt++))
    done
    
    log_error "健康检查失败"
    return 1
}

# 主部署流程
main() {
    check_requirements
    create_directories
    setup_environment
    
    if [[ "$DEPLOY_METHOD" == "docker" ]]; then
        deploy_with_docker
    elif [[ "$DEPLOY_METHOD" == "pm2" ]]; then
        deploy_with_pm2
    else
        log_error "不支持的部署方式: $DEPLOY_METHOD"
        exit 1
    fi
    
    health_check
    
    log_success "🎉 部署完成！"
    log_info "应用访问地址: http://localhost:3000"
    log_info "健康检查地址: http://localhost:3000/health"
}

# 执行主函数
main